From: Isaku Yamahata Date: Tue, 22 Jul 2008 03:15:02 +0000 (+0900) Subject: [IA64] kexec: add __va_efi X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14175 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=8c2d0ddcc54b1523938bc893d726a036497cc0cf;p=xen.git [IA64] kexec: add __va_efi sal_desc_entry_point() converts physical addresses into virtual addresses using __va() and these virtual addresses are used to register the SAL and PAL handlers - which exist in firmware memory. As the mapping of firmware memory is being moved from a PAGE_OFFSET of (0xf << 60) to a PAGE_OFFSET of (0xe << 60), __va() does not provide the correct virtual address. By adding __va_efi(), which uses EFI_PAGE_OFFSET=(0xe << 60), and using this in sal_desc_entry_point(), the correct address is used. On an HP rx2600 this eliminates the problem where the SAL rendezvous address can't be registered and subsequently the boot fails. I suspect it solves similar problems that have been seen on other HP machines too. Actually, its rather amazing that the HP rx2620 and Tiger2 that I have been using work without this fix. Signed-off-by: Simon Horman --- diff --git a/xen/arch/ia64/linux-xen/sal.c b/xen/arch/ia64/linux-xen/sal.c index a0f19ed98b..564dfa4730 100644 --- a/xen/arch/ia64/linux-xen/sal.c +++ b/xen/arch/ia64/linux-xen/sal.c @@ -121,8 +121,8 @@ static void __init sal_desc_entry_point (void *p) { struct ia64_sal_desc_entry_point *ep = p; - ia64_pal_handler_init(__va(ep->pal_proc)); - ia64_sal_handler_init(__va(ep->sal_proc), __va(ep->gp)); + ia64_pal_handler_init(__va_efi(ep->pal_proc)); + ia64_sal_handler_init(__va_efi(ep->sal_proc), __va_efi(ep->gp)); } #ifdef CONFIG_SMP diff --git a/xen/include/asm-ia64/xenpage.h b/xen/include/asm-ia64/xenpage.h index 443ba882e2..74562230ef 100644 --- a/xen/include/asm-ia64/xenpage.h +++ b/xen/include/asm-ia64/xenpage.h @@ -97,5 +97,14 @@ static inline u64 pa_clear_uc(u64 paddr) /* It is sometimes very useful to have unsigned long as result. */ #define __va_ul(x) ({xen_va _v; _v.l = (long) (x); _v.f.reg = -1; _v.l;}) +/* __va_efi() should just call __va() until the use of + * __IA64_EFI_CACHED_OFFSET is activated in efi_enter_virtual_mode() + */ +#if 0 +#define __va_efi(x) ((void*)((unsigned long)(x) | __IA64_EFI_CACHED_OFFSET)) +#else +#define __va_efi(x) __va(x) +#endif + #endif #endif /* _ASM_IA64_XENPAGE_H */